﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using PhoneApplicPersons.Interfaces;

namespace PhoneApplicPersons.Classes
{
    /// <summary>
    /// Класс, реализующий персону
    /// </summary>
    public class Persona : IComparable<Persona>
    {
        int id;
        string fname;
        string lname;
        int age;

        /// <summary>
        /// Поле "ID" 
        /// </summary>
        public int ID
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        /// <summary>
        /// Поле "Имя"
        /// </summary>
        public string Fname
        {
            get
            {
                return fname;
            }
            set
            {
                fname = value;
            }
        }
        /// <summary>
        /// Поле "Фамилия"
        /// </summary>
        public string Lname
        {
            get
            {
                return lname;
            }
            set
            {
                lname = value;
            }
        }
        /// <summary>
        /// Поле "Возраст"
        /// </summary>
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
        /// <summary>
        /// Пустой конструктор персоны
        /// </summary>
        public Persona() { }
        /// <summary>
        /// Конструктор персоны
        /// </summary>
        /// <param name="_id">ID персоны</param>
        /// <param name="_fname">Имя персоны</param>
        /// <param name="_lname">Фамилия персоны</param>
        /// <param name="_age">Возраст персоны</param>
        public Persona(int _id, string _fname, string _lname, int _age)
        {
            ID = _id;
            Fname = _fname;
            Lname = _lname;
            Age = _age;
        }
        /// <summary>
        /// Метод сравнения текущей персоны с другой персоной
        /// </summary>
        /// <param name="other">Другая персона</param>
        /// <returns>Меньше нуля - Данный экземпляр в порядке сортировки следует перед other. Нуль - Данный экземпляр имеет ту же позицию в порядке сортировки, что и объект other. Больше нуля - Данный экземпляр в порядке сортировки следует после other. </returns>
        public int CompareTo(Persona other)
        {
            return ID.CompareTo(other.ID);
        }

        //------------------------------------------------------------
        //CSV
        //
        /// <summary>
        /// Метод преобразует указанную персону в строку формата CSV
        /// </summary>
        /// <param name="per">Персона для преобразования</param>
        /// <returns>Строку формата CSV</returns>
        public static string MakeCSVStrFromPersona(Persona per)
        {
            return string.Format("{0},{1},{2},{3}", per.ID.ToString(), per.Fname, per.Lname, per.Age.ToString());
        }
        /// <summary>
        /// Метод преобразует строку формата CSV в персону
        /// </summary>
        /// <param name="str">Строка формата CSV</param>
        /// <returns>Персону</returns>
        public static Persona GetPersonaFromCSVStr(string str)
        {
            char[] p = { ',' };
            string[] line = str.Split(p);
            Persona per = new Persona(Convert.ToInt32(line[0]), line[1], line[2], Convert.ToInt32(line[3]));
            return per;
        }

        //------------------------------------------------------------
        //DB
        //
        /// <summary>
        /// Метод преобразует указанную персону в строку INSERT для вставки персоны в БД
        /// </summary>
        /// <param name="per">Персона для преобразования</param>
        /// <returns>Строку INSERT</returns>
        //public static string MakeDBStrFromPersona(Persona per)
        //{
        //    return "INSERT Persona (ID, Fname, Lname, Age) Values (" + per.ID + ",\'" + per.Fname + "\'" + ",\'" + per.Lname + "\'" + "," + per.Age + ")";
        //}
        /// <summary>
        /// Метод преобразует строку формата БД в персону
        /// </summary>
        /// <param name="str">Строка формата БД</param>
        /// <returns>Персону</returns>
        //public static Persona GetPersonaFromDB(OleDbDataReader reader)
        //{
        //    return new Persona((int)reader["ID"], reader["Fname"].ToString(), reader["Lname"].ToString(), (int)reader["Age"]);

        //}
        /// <summary>
        /// Метод, выполняющий указанную операцию CRUD'а в соответствии с параметром "typeOfOperation"
        /// </summary>
        /// <param name="ds">Интерфейс хранилища для реализации операции</param>
        /// <param name="typeOfOperation">Тип операции CRUD (create, update, read, readid, delete)</param>
        /// <param name="data">Данные, необходимые для выполнения операции</param>
        /// <returns>Список персон (возможно значение null)</returns>
        //public static List<Persona> DoOperation(IDS ds, string typeOfOperation, string data)
        //{
        //    List<Persona> rez = null;
        //    switch (typeOfOperation)
        //    {
        //        case "create":
        //            {
        //                ds.Create(Persona.GetPersonaFromCSVStr(data));
        //                break;
        //            }
        //        case "update":
        //            {
        //                ds.Update(Persona.GetPersonaFromCSVStr(data));
        //                break;
        //            }
        //        case "read":
        //            {
        //                rez = ds.Read();
        //                break;
        //            }
        //        case "readid":
        //            {
        //                rez = ds.Read(Convert.ToInt32(data));
        //                break;
        //            }
        //        case "delete":
        //            {
        //                ds.Delete(Convert.ToInt32(data));
        //                break;
        //            }
        //        default:
        //            {
        //                break;
        //            }

        //    }
        //    return rez;
        //}
    }
}
